#pragma once

/* MySQL 数据库的所有操作都不是直接通过SQL语句对MySQL对数据进行操作的，而是通过ODB框架来去编写ODB的映射代码，然后将对象映射到数据库上来
完成对数据库的操作。 */

#include "logger.hpp"
#include <string>
#include <memory> // std::auto_ptr
#include <cstdlib> // std::exit
#include <iostream>
#include <odb/database.hxx>
#include <odb/mysql/database.hxx>

namespace ChatSystem
{
    //用户注册， 用户登录，验证码获取，手机号注册，手机号登录，获取用户信息
    //用户信息新增，通过昵称获取用户信息，通过手机号获取用户信息，通过用户ID获取用户信息，通过多个用户ID获取多个用户信息，信息修改

    class ODBFactory
    {
    public:
        static std::shared_ptr<odb::core::database> create(
            const std::string& user,
            const std::string& password,
            const std::string& host,
            const std::string& db,
            const std::string& cset,
            int port,
            int connection_pool_count)
        {
            //注意这里的智能指针只能使用unique_ptr不能使用其他的智能指针，否则会报错
            std::unique_ptr<odb::mysql::connection_pool_factory> cpf(new odb::mysql::connection_pool_factory(connection_pool_count, 0));
            //2. 构造数据库操作对象
            auto res = std::make_shared<odb::mysql::database>(user, password, db, host, port, "", cset, 0, std::move(cpf));
            return res;
        }
    private:
    };

}